from django_redis import get_redis_connection
from rest_framework import serializers


class image_code_serializer(serializers.Serializer):
    """图形验证码序列化校验器"""
    # 对传入参数进行校验
    # 初步校验id为uuid类型
    image_code_id = serializers.UUIDField()
    # 图片验证码为四位
    text = serializers.CharField(min_length=4, max_length=4)

    # 对二者进行更高级的校验
    def validate(self, attrs):
        """校验图片验证码"""
        # attrs是类属性字典,可以先定义出属性
        image_code_id = attrs['image_code_id']
        text = attrs['text']

        # 查询真实图片验证码
        redis_conn = get_redis_connection('verify_code')
        real_image_code = redis_conn.get('img_code_%s' % image_code_id)
        if not real_image_code:
            # 判断前端是否是随便拿个uuid来取或者已经过期
            raise serializers.ValidationError('图片验证码无效')

        # 在比较之前删除这个图片验证码,以保证这个图片yzm只能使用一次
        redis_conn.delete('img_code_%s' % image_code_id)
        # 比较前端传过来的yzm和真实的是否相同
        # 从redis中取出的数据是bytes类型  需要进行解码
        real_code = real_image_code.decode()
        if text.lower() != real_code.lower():
            raise serializers.ValidationError('图片验证码错误')

        # 判断是否在60s内
        mobile = self.context['view'].kwargs['mobile']
        # send_flag保存的有效期为60s  如果存在  说明是60s内的第二次请求
        send_flag = redis_conn.get("send_flag_%s" % mobile)
        if send_flag:
            raise serializers.ValidationError("请求过于频繁")
        return attrs
